/**
 * 用于演示 async await 的实现原理
 * 一个执行协调执行生成器的辅助方法
 * @param generator
 */
module.exports.myRun = function (generator) {
    // 找到 数组（Array）原型中的 slice 方法，并截取传入此方法的第一个到最后一个参数为一个数组
    const args = Array.prototype.slice.call(arguments, 1)
    // 调用生成器，得到一个迭代器
    // 这里注意 apply() 和 call() 的区别
    // apply() 的第二个参数为一个数组，这个数组会（被展开）并用到被调用方法的参数列表中
    // call() 方法，给他传递几个参数，参数会被（一一对应的传递）到被调用方法的参数列表中
    const iterator = generator.apply(this, args)
    // 启动生成器
    // 调用生成器产生的迭代器的 next() 方法 无论如何都会产生一个 {done:boolean,value:'xxx'} 的结果
    // 调用任何迭代器都会生成这样的结果，标准的生成器应该只返回 {done:boolean,value:promise}
    const firstDoneValue = iterator.next()

    executeNext(firstDoneValue)

    function executeNext(doneValue) {
        // 为了实现一个递归效果：生成器中有多少个 yield 就执行多少次 executeNext() 方法
        Promise.resolve(doneValue.value).then(function handleSuccess(promiseResult) {
            if (doneValue.done) {
                //    抵达生成器的最后一个 yield 结束执行
            } else {
                // 使用 promiseResult 替换掉生成器中 当前的 (yield promise)
                // 然后向下继续执行到下一个 yield
                // 下一个 yield 返回一个新的 {done:boolean,value:promise} 递归调用本方法
                const nextDoneValue = iterator.next(promiseResult)

                executeNext(nextDoneValue)
            }
        })
    }


}
